package com.LatitudeYao;
import java.lang.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

/**
 * Created by GTS on 2017/7/20.
 *
 *    RTTI（Run-Time Type Identification，通过运行时类型识别）的含义就是在运行时识别一个对象的类型，其对应的类是Class对象，每个java里面的类都对应一个Class对象(在编写并且编译后)，这个对象被保存在这个类的同名class文件里。
 * Java提供的另外一种更加安全的得到Class类的对象的方式是，使用类字面常量。
 classname.class;

 Java在RTTI中的第三种形式是最常见的。就是instanceof关键字，用法就不多说了。该关键字的调用其实就是使用了Class对象，并且返回一个布尔值。如果说instanceof和Class的比较唯一的不同，那就是instanceof如果是其子类的对象也会返回true，而Class对象比较的会是确切的那个类型。

 这样得到类的Class对象可以在编译器就得到检查。


 */


class User {

    private int age;

    private String name;

    public User() {

        super();

    }

    public User(String name) {

        super();

        this.name = name;

    }

    public User(int age, String name) {

        super();

        this.age = age;

        this.name = name;

    }

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        this.age = age;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "User [age=" + age + ", name=" + name + "]";
    }

}
public class MyReflection {
    public static void main(String[] args) throws Exception {

        Class<?> class1 = null;

        class1 = Class.forName("com.LatitudeYao.User");

        // 第一种方法，实例化默认构造方法，调用set赋值
        User user = (User) class1.newInstance();
        user.setAge(20);
        user.setName("YM0");
        System.out.println(user);




        // 第二种方法 取得全部的构造函数 使用构造函数赋值
        Constructor<?> cons[] = class1.getConstructors();
        // 查看每个构造方法需要的参数
        for (int i = 0; i < cons.length; i++) {
            Class<?> clazzs[] = cons[i].getParameterTypes();
            System.out.print("cons[" + i + "] (");
            for (int j = 0; j < clazzs.length; j++) {
                if (j == clazzs.length - 1)
                    System.out.print(clazzs[j].getName());
                else
                    System.out.print(clazzs[j].getName() + ",");
            }
            System.out.println(")");
        }
        User user1 = (User) cons[1].newInstance("YM1");
        System.out.println(user1);

        User user2 = (User) cons[0].newInstance(30, "YM2");
        System.out.println(user2);

        Class class4 = Class.forName("com.LatitudeYao.User");
        Constructor<?> myConstructor[]  = class4.getConstructors();
        System.out.println(myConstructor.length);
        for (Constructor cts:myConstructor
             ) {
            System.out.println(cts.toGenericString());
        }
        System.out.println("       ");
        //获取到对象的所有字段
        Field[] myReflectionField = class4.getDeclaredFields();
        for (Field st:myReflectionField
             ) {
            System.out.println(st.toGenericString());
        }
    }





}
